#ifndef TLV_PACK_COM_H
#define TLV_PACK_COM_H

#include <stdint.h>
/* fixbyme：MODULE_CHOSE_TYPE / DEVICE_CHOSE_ID 在其他头文件*/
#include <cfg_param.h>

/* 统一使用同一套帧头帧尾
   数据格式：帧头 设备ID(标注设备和ID号) TLV结构体 4个字节和校验码（除帧头帧尾和和校验码外所有字节） 帧尾*/
#define PROTOCOL_HEAD         (uint16_t)0x55AA // 协议头
#define PROTOCOL_HEAD_LEN     2                // 协议头长度，固定2字节
#define PROTOCOL_DEVICEID_LEN 2                // 设备ID长度，固定2字节
#define PROTOCOL_TAG_LEN      2                // CMDTAG长度，固定2字节
#define PROTOCOL_LENGTH_LEN   2                // LENGTH长度，固定2字节
#define PROTOCOL_CRC_LEN      4                // 和校验CRC长度，固定4字节
#define PROTOCOL_TAIL_LEN     2                // 协议尾长度，固定2字节
#define PROTOCOL_TAIL         (uint16_t)0xCCDD // 协议尾

/* fixbyme: 数据报长度最大上限*/
#define MSG_BUFFER_MAX_SIZE 256
/* fixbyme：校验所需设备模块*/
#define DEVICE_MODULE MODULE_CHOSE_TYPE //自定义，可参考tlv_cmd.h的enum ModuleTypEn
/* fixbyme：校验所需设备ID*/
#define DEVICE_ID DEVICE_CHOSE_ID //自定义，可参考tlv_cmd.h的enum DeviceTypeEn << 8 || enum ChipIdEn

/* TLV结构体*/
struct TLVPacket
{
    union
    {
        struct
        {
            uint8_t tagmodule;
            uint8_t tagcmd;
        };
        uint8_t tag[PROTOCOL_TAG_LEN]; // 结合的tag
    };
    uint8_t length[PROTOCOL_LENGTH_LEN];
    uint8_t value[MSG_BUFFER_MAX_SIZE];
};

/* 数据报结构(拆分为HEAD和TAIL两部分)*/
struct MsgBuffferHeadSt
{
    uint8_t head[PROTOCOL_HEAD_LEN];
    uint8_t deviceid[PROTOCOL_DEVICEID_LEN];
    struct TLVPacket tlvpacket;
};

struct MsgBufferTailSt
{
    uint8_t check[PROTOCOL_CRC_LEN];
    uint8_t tail[PROTOCOL_TAIL_LEN];
};

/* 组包接口*/
uint16_t hal_pack(uint16_t deviceid, struct TLVPacket *tlvpack, uint8_t *sendbuf);
/* 解包接口*/
uint8_t hal_unpack(uint8_t *rcvbuf, uint8_t rcvlen, struct TLVPacket *tlvpack);

#endif